//+------------------------------------------------------------------+
//|                                                     SignalAC.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Expert/ExpertSignal.h>    // 专家顾问信号基类（提供信号生成框架）

// wizard description start（MQL5 策略向导描述，用于识别类信息与参数）
//+------------------------------------------------------------------+
//| 类功能描述                                                       |
//| Title=基于加速振荡器（Accelerator Oscillator）的交易信号          |
//| Type=SignalAdvanced                                              |
//| Name=Accelerator Oscillator                                      |
//| ShortName=AC                                                     |
//| Class=CSignalAC                                                  |
//| Page=signal_ac                                                   |
//+------------------------------------------------------------------+
// wizard description end

//+------------------------------------------------------------------+
//| CSignalAC 类：基于加速振荡器（AC）的交易信号生成器                  |
//| 核心能力：继承自 CExpertSignal，通过调用 AC 指标计算其差值（DiffAC），  |
//|           基于多根K线的 AC 指标形态（颜色、趋势变化）生成多空交易信号，  |
//|           支持通过“信号权重”调整不同形态的信号强度，适配策略风险偏好   |
//| 核心逻辑：AC 指标差值（DiffAC）>0 为“绿柱”（看涨倾向），<0 为“红柱”（看跌倾向）， |
//|           通过连续多根K线的柱体颜色组合判断趋势延续/反转，生成信号权重  |
//| 适用场景：趋势跟踪策略（AC 指标擅长识别趋势加速/减速），适合外汇、期货等 |
//|           中短线交易，需与其他过滤条件（如均线、成交量）配合使用        |
//+------------------------------------------------------------------+
class CSignalAC : public CExpertSignal
  {
protected:
   // 核心组件与参数（保护，子类可访问）
   CiAC              m_ac;             // AC 指标对象（封装加速振荡器的计算与数据读取）
   // 市场形态信号权重（0-100，值越大信号优先级越高，默认配置兼顾灵敏度与稳定性）
   int               m_pattern_0;      // 形态0权重：首根分析K线符合预期颜色（如多单需首根为绿柱）
   int               m_pattern_1;      // 形态1权重：存在持续的开仓条件（如连续多根K线符合趋势）
   int               m_pattern_2;      // 形态2权重：开仓条件刚刚形成（趋势由反转向预期方向切换）

public:
   //----------------------------------------------------------------
   // 构造与析构函数
   //----------------------------------------------------------------
   /**
    * @brief 构造函数：初始化 AC 信号生成器
    * @details 初始化 AC 指标对象，设置默认信号权重（形态0=90，形态1=50，形态2=30），
    *          继承父类 CExpertSignal 的信号框架初始化
    */
                     CSignalAC(void);

   /**
    * @brief 析构函数：清理 AC 信号生成器资源
    * @details 释放 AC 指标对象占用的内存，依赖父类析构逻辑完成信号框架资源清理
    */
                    ~CSignalAC(void);

   //----------------------------------------------------------------
   // 信号权重配置：修改不同市场形态的信号强度（外部调用接口）
   //----------------------------------------------------------------
   /**
    * @brief 设置形态0（首根K线颜色符合预期）的信号权重
    * @param value [in] 权重值（0-100，建议50-100，值越大越重视首根K线的颜色验证）
    */
   void              Pattern_0(int value);

   /**
    * @brief 设置形态1（存在持续开仓条件）的信号权重
    * @param value [in] 权重值（0-100，建议30-70，值越大越重视趋势的持续性）
    */
   void              Pattern_1(int value);

   /**
    * @brief 设置形态2（开仓条件刚刚形成）的信号权重
    * @param value [in] 权重值（0-100，建议20-50，值越大越重视趋势反转的即时信号）
    */
   void              Pattern_2(int value);

   //----------------------------------------------------------------
   // 指标初始化：创建并注册 AC 指标（信号生成的前提）
   //----------------------------------------------------------------
   /**
    * @brief 初始化 AC 指标及信号所需的时间序列数据
    * @param indicators [in] 指标集合对象（用于管理所有策略用到的指标，如 AC、均线等）
    * @return bool - 初始化结果：true=成功（AC 指标创建+注册到指标集合），false=失败
    * @note 调用流程：
    *       1. 先调用父类 InitIndicators() 完成基础信号框架初始化；
    *       2. 调用内部 InitAC() 方法创建 AC 指标并绑定当前交易品种与周期；
    *       3. 若指标创建失败（如品种无效），返回 false 并终止信号生成
    */
   virtual bool      InitIndicators(CIndicators *indicators);

   //----------------------------------------------------------------
   // 信号判断核心方法：生成多空信号权重（策略决策依据）
   //----------------------------------------------------------------
   /**
    * @brief 判断当前市场是否满足多单（买入）开仓条件，返回信号权重
    * @return int - 多单信号权重（0-100，0=无信号，值越大信号越强烈）
    * @note 核心判断逻辑（基于 AC 指标差值 DiffAC）：
    *       1. 形态0验证：首根分析K线的 DiffAC>0（绿柱，看涨倾向），不满足则返回0；
    *       2. 形态1验证：第二根K线 DiffAC>0（持续绿柱，趋势延续），满足则叠加形态1权重；
    *       3. 形态2验证：若第二根K线曾低于0（红柱转绿柱），说明趋势刚切换，叠加形态2权重；
    *       4. 最终返回叠加后的最大权重（如形态0+形态1=90，取最大值90）
    */
   virtual int       LongCondition(void);

   /**
    * @brief 判断当前市场是否满足空单（卖出）开仓条件，返回信号权重
    * @return int - 空单信号权重（0-100，0=无信号，值越大信号越强烈）
    * @note 核心判断逻辑（与多单相反，基于 AC 指标差值 DiffAC）：
    *       1. 形态0验证：首根分析K线的 DiffAC<0（红柱，看跌倾向），不满足则返回0；
    *       2. 形态1验证：第二根K线 DiffAC<0（持续红柱，趋势延续），满足则叠加形态1权重；
    *       3. 形态2验证：若第二根K线曾高于0（绿柱转红柱），说明趋势刚切换，叠加形态2权重；
    *       4. 最终返回叠加后的最大权重
    */
   virtual int       ShortCondition(void);

protected:
   //----------------------------------------------------------------
   // 内部辅助方法：AC 指标初始化（仅内部调用）
   //----------------------------------------------------------------
   /**
    * @brief 创建并初始化 AC 指标（绑定品种、周期，注册到指标集合）
    * @param indicators [in] 指标集合对象（用于管理 AC 指标）
    * @return bool - 初始化结果：true=成功（指标创建+参数配置完成），false=失败
    * @note 内部流程：
    *       1. 检查指标集合指针有效性；
    *       2. 将 AC 指标对象（m_ac）添加到指标集合；
    *       3. 调用 m_ac.Create() 绑定当前交易品种（m_symbol.Name()）与周期（m_period）；
    *       4. 若添加或创建失败，输出错误日志并返回 false
    */
   bool              InitAC(CIndicators *indicators);

   //----------------------------------------------------------------
   // AC 数据读取：快捷获取指标值（保护，子类可直接调用）
   //----------------------------------------------------------------
   /**
    * @brief 获取指定索引的 AC 指标原始值
    * @param ind [in] 索引（0=当前K线，1=前一根K线，以此类推）
    * @return double - AC 指标值（正数/负数/零，反映市场动量）
    */
   double            AC(int ind);

   /**
    * @brief 计算指定索引K线的 AC 指标差值（当前K线 - 前一根K线，即柱体颜色判断依据）
    * @param ind [in] 索引（0=当前K线，1=前一根K线，以此类推）
    * @return double - AC 差值（>0=绿柱，<0=红柱，=0=无柱）
    * @note 差值符号直接决定 AC 指标柱体颜色，是信号判断的核心数据
    */
   double            DiffAC(int ind);
  };
//+------------------------------------------------------------------+